#!/bin/bash

# 部署包打包脚本

echo "=========================================="
echo "  文件同步器 - 创建部署包"
echo "=========================================="
echo ""

# 定义变量
DEPLOY_DIR="file-sync-server-deploy"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
PACKAGE_NAME="file-sync-server_${TIMESTAMP}.tar.gz"

# 清理旧的部署目录
if [ -d "$DEPLOY_DIR" ]; then
    echo "🧹 清理旧的部署目录..."
    rm -rf "$DEPLOY_DIR"
fi

# 创建部署目录结构
echo "📁 创建部署目录..."
mkdir -p "$DEPLOY_DIR"
mkdir -p "$DEPLOY_DIR/src"
mkdir -p "$DEPLOY_DIR/web/dist"
mkdir -p "$DEPLOY_DIR/uploads"
mkdir -p "$DEPLOY_DIR/logs"

# 复制后端文件
echo "📦 复制后端文件..."
cp -r src/* "$DEPLOY_DIR/src/"
cp package.json "$DEPLOY_DIR/"
cp package-lock.json "$DEPLOY_DIR/" 2>/dev/null || true
cp .env.example "$DEPLOY_DIR/"

# 复制前端构建文件
if [ -d "web/dist" ]; then
    echo "📦 复制前端构建文件..."
    cp -r web/dist/* "$DEPLOY_DIR/web/dist/"
else
    echo "⚠️  警告: web/dist 目录不存在，请先运行 ./build-frontend.sh"
    echo "   继续创建部署包（仅包含后端）..."
fi

# 创建启动脚本
echo "📝 创建启动脚本..."
cat > "$DEPLOY_DIR/start.sh" << 'EOF'
#!/bin/bash

# 文件同步器服务器启动脚本

echo "启动文件同步器服务器..."

# 检查 .env 文件
if [ ! -f ".env" ]; then
    echo "❌ 错误: .env 文件不存在"
    echo "   请复制 .env.example 为 .env 并配置"
    exit 1
fi

# 检查 node_modules
if [ ! -d "node_modules" ]; then
    echo "📦 安装依赖..."
    npm install --production
fi

# 启动服务器
echo "🚀 启动服务器..."
NODE_ENV=production node src/app.js
EOF

chmod +x "$DEPLOY_DIR/start.sh"

# 创建 PM2 配置文件
echo "📝 创建 PM2 配置..."
cat > "$DEPLOY_DIR/ecosystem.config.js" << 'EOF'
module.exports = {
  apps: [{
    name: 'file-sync-server',
    script: 'src/app.js',
    instances: 1,
    exec_mode: 'fork',
    watch: false,
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    error_file: './logs/pm2-error.log',
    out_file: './logs/pm2-out.log',
    log_date_format: 'YYYY-MM-DD HH:mm:ss',
    merge_logs: true,
    autorestart: true,
    max_restarts: 10,
    min_uptime: '10s'
  }]
}
EOF

# 创建 nginx 配置示例
echo "📝 创建 Nginx 配置示例..."
cat > "$DEPLOY_DIR/nginx.conf.example" << 'EOF'
# Nginx 配置示例
# 将此配置添加到宝塔面板的站点配置中

upstream file_sync_backend {
    server 127.0.0.1:3000;
    keepalive 64;
}

server {
    listen 80;
    server_name your-domain.com;  # 修改为你的域名
    
    # 日志
    access_log /www/wwwlogs/file-sync-access.log;
    error_log /www/wwwlogs/file-sync-error.log;
    
    # 前端静态文件
    location / {
        root /www/wwwroot/file-sync-server/web/dist;
        try_files $uri $uri/ /index.html;
        index index.html;
    }
    
    # API 代理
    location /api/ {
        proxy_pass http://file_sync_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
    
    # WebSocket 代理
    location /socket.io/ {
        proxy_pass http://file_sync_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 7d;
        proxy_send_timeout 7d;
        proxy_read_timeout 7d;
    }
    
    # 上传文件访问
    location /uploads/ {
        alias /www/wwwroot/file-sync-server/uploads/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
    
    # 健康检查
    location /health {
        proxy_pass http://file_sync_backend;
        access_log off;
    }
}
EOF

# 创建部署说明
echo "📝 创建部署说明..."
cat > "$DEPLOY_DIR/README.md" << 'EOF'
# 文件同步器服务器 - 部署包

## 📦 包含内容

- `src/` - 后端源代码
- `web/dist/` - 前端构建文件
- `package.json` - 依赖配置
- `.env.example` - 环境变量示例
- `start.sh` - 启动脚本
- `ecosystem.config.js` - PM2 配置
- `nginx.conf.example` - Nginx 配置示例

## 🚀 快速部署

### 1. 上传文件
将整个目录上传到服务器，例如：
```
/www/wwwroot/file-sync-server/
```

### 2. 配置环境变量
```bash
cp .env.example .env
nano .env  # 修改配置
```

### 3. 安装依赖
```bash
npm install --production
```

### 4. 启动服务
```bash
# 方式1: 直接启动
./start.sh

# 方式2: 使用 PM2（推荐）
pm2 start ecosystem.config.js
pm2 save
pm2 startup
```

### 5. 配置 Nginx
参考 `nginx.conf.example` 配置反向代理

## 📖 详细文档

请查看 `宝塔面板部署教程.md`
EOF

# 打包
echo ""
echo "📦 打包部署文件..."
tar -czf "$PACKAGE_NAME" "$DEPLOY_DIR"

if [ $? -eq 0 ]; then
    # 获取文件大小
    SIZE=$(ls -lh "$PACKAGE_NAME" | awk '{print $5}')
    
    echo ""
    echo "=========================================="
    echo "✅ 部署包创建成功！"
    echo "=========================================="
    echo ""
    echo "📦 部署包: $PACKAGE_NAME"
    echo "📊 文件大小: $SIZE"
    echo ""
    echo "📁 部署目录: $DEPLOY_DIR/"
    echo ""
    echo "📋 包含文件:"
    echo "   - 后端源代码 (src/)"
    echo "   - 前端构建文件 (web/dist/)"
    echo "   - 配置文件 (package.json, .env.example)"
    echo "   - 启动脚本 (start.sh)"
    echo "   - PM2 配置 (ecosystem.config.js)"
    echo "   - Nginx 配置示例 (nginx.conf.example)"
    echo ""
    echo "💡 下一步:"
    echo "   1. 将 $PACKAGE_NAME 上传到服务器"
    echo "   2. 解压: tar -xzf $PACKAGE_NAME"
    echo "   3. 按照 README.md 进行部署"
    echo ""
else
    echo "❌ 打包失败"
    exit 1
fi

# 清理临时目录（可选）
# rm -rf "$DEPLOY_DIR"
